
(function (window, $, undefined) {
  'use strict';

  var $sideMenu = $('#nav-view');
  // 标识是否为有效访问页面
  var isValidPage = false;

  window.oUser = {};

  $(function () {
    // 阻止链接/按钮的回车事件
    $('button, a, input[type="button"], form.no-keydown').not('.allow-keydown').on('keydown.pms', function (e) {
      if (e.keyCode === 13 && e.target.nodeName.toUpperCase() !== 'TEXTAREA') {
        return false;
      }
    });

    // 表格错误友好性改进，出错的输入框重新聚焦时自动选中
    $('body').on('focus.error', 'input[name]', function () {
      var $this = $(this);
      if ($this.hasClass('error')) {
        $this.select();
      }
    });
  });

  var $headerList = $('#header-list').hide();
  var $menuCur = $('#menu-cur');

  // 顶部系统切换列表效果
  $('#header-fix').click(function () {
    $menuCur.toggleClass('on');
    $headerList.slideToggle();
  });

  // 顶部效果卷起
  $('body').on('mousedown.mc', function (e) {
    if ($menuCur.hasClass('on') && $(e.target).closest('#header-fix, #header-list').length === 0) {
      $menuCur.click();
    }
  });

  $sideMenu.on('click', '.nav-title', function () {
    var $this = $(this);

    var $parent = $this.parent();
    var $list = $parent.find('.nav-list');
    var hasOn = $parent.hasClass('on');
    if (hasOn) {
      $list.slideUp(300);
      $parent.removeClass('on');
      return;
    }
    $sideMenu.find('.nav-item').removeClass('on').find('.nav-list').hide();
    $parent.addClass('on');
    $list.slideDown(300);
  });

  var locationHref = window.location.href.toLowerCase();

  $sideMenu.on('click', '[data-href]', function () {
    var $this = $(this);
    var href = $this.data('href');
    if ($this.parent().hasClass('on')) {
      return;
    }
    if (href) {
      window.location.href = locationHref.replace(/\/html\/.*/, '/html/' + href);
    }
  });

  $('#sidebar-personal').on('click', function () {
    var $this = $(this);
    var href = $this.data('href');
    if (href) {
      layer.confirm('跳转至个人中心页面？', function () {
        window.location.href = locationHref.replace(/\/html\/.*/, '/html/' + href);
      });
    }
  });

  $('#sidebar-logout').on('click', function () {
    layer.confirm('是否退出登录', function () {
      // 清理所有缓存数据
      sessionStorage.clear();
      localStorage.clear();
      window.location.href = '/login.html';
    });
  });

  // 顶部菜单跳转效果
  $headerList.on('click', '[data-href]', function () {
    var $this = $(this);
    var curHref = $this.data('href');
    window.location.href = locationHref.replace(/\/html\/.*/, '/html/' + curHref);
  });

  // 获取用户登录信息
  function getLoginInfo(dfd) {

    if (util.checkToken()) {
      $.ajaxSetup({
        headers: {
          'token': oUser.token
        }
      });
      return dfd.resolve();
    }

    return dfd.reject();

    // 动态获取用户信息并进行权限判断暂未实现
    // TODO
  }

  // 获取菜单信息
  function getMenuInfo(dfd) {
    var menuData = [];

    // 有则先渲染一次，然后再重新请求一次数据
    if (localStorage.menu) {
      menuData = JSON.parse(localStorage.menu);
      renderMenu(menuData);
    }

    util.get(ajaxURL.SYSTEM + (oUser.account === 'admin' ? '/sys/v1/menu/queryAll' : '/sys/v1/menu/queryMenuByRole?userId=' + oUser.userId), function (res) {
      if (res.data && res.data.length > 0) {
        menuData = res.data;
        localStorage.menu = JSON.stringify(menuData);
        renderMenu(menuData);
        dfd.resolve();
      } else {
        util.tip.warn('当前用户无可用菜单，请重新登录', 2000, function () {
          // 清理所有缓存数据
          sessionStorage.clear();
          localStorage.clear();
          window.location.href = '/login.html';
        });
      }
    });

    return dfd.promise();
  }

  // 渲染菜单操作
  function renderMenu(data) {
    // 将数组数据转为结构数据
    var headerMenu = [];
    var allMenuData = window.allMenuData = {};
    var validMenu = [];

    // 递归获取所有子菜单
    function getChildren(id, level) {
      var ret = [];
      // 最多四级菜单
      if (level < 5) {
        $.each(data, function (_, item) {
          if (item.pid === id) {
            ret.push({
              name: item.name,
              href: item.url,
              icon: item.icon,
              level: level,
              children: getChildren(item.kid, level + 1)
            });
          }
        });
      }
      return ret;
    }

    // 获取一个有效的顶部链接
    function getHeaderHref(url, key) {
      if (validMenu.indexOf(url) > -1) {
        return url;
      }
      var temp = allMenuData[key].children[0];
      if (temp.children.length > 0) {
        return temp.children[0].href;
      }

      return temp.href;
    }

    // 有效链接优先提取，用于后面默认链接的判断
    $.each(data, function (_, item) {
      if (item.url && item.pid > 0) {
        validMenu.push(item.url);
      }
    });

    $.each(data, function (_, item) {
      if (item.pid === 0) {
        allMenuData[item.icon] = {
          name: item.name,
          href: item.url,
          level: 1,
          children: getChildren(item.kid, 1)
        };
        headerMenu.push({
          key: item.icon,
          name: item.name,
          href: getHeaderHref(item.url, item.icon)
        });
      }
    });

    var curHref = window.location.pathname.toLowerCase();
    var matched = curHref.match(/\/html\/(([^/]+)\/[^.]+)\.html/);

    if (validMenu.indexOf('base/personal') > -1) {
      $('#sidebar-personal').attr({
        title: '跳转至个人中心，主要用于修改密码',
        'data-href': 'base/personal.html'
      });
    }

    isValidPage = false;
    if (matched) {
      var curPath = matched[1];
      if (curPath === 'index/index' || curPath === 'misc/mod-pwd') {
        // 首页和修改密码页默认通过
        isValidPage = true;
      } else if (validMenu.indexOf(matched[1]) > -1) {
        isValidPage = true;
      }

      // 渲染顶部菜单
      var strHeaderList = '<ul class="clear-fix">';
      $.each(headerMenu, function (_, item) {
        var isCurHead = item.key === matched[2];
        strHeaderList += '<li>';
        strHeaderList += '<a' + (isCurHead ? ' class="hover"' : '') + ' href="javascript:;" data-href="' + (item.href + '.html') + '">' + item.name + '</a>';
        strHeaderList += '</li>';
        if (isCurHead) {
          $menuCur.text(item.name);
        }
      });
      strHeaderList += '</ul>';

      $headerList.html(strHeaderList);

      //
      var curMenuData = allMenuData[matched[2]];
      var strMenu = '';
      if (curMenuData) {
        $.each(curMenuData.children, function (_, item) {
          var curItem = '';
          curItem += '<div class="nav-item' + (item.children.length === 0 && item.href === matched[1] ? ' on"' : '') + '">';
          if (item.children.length > 0) {
            curItem += '<div class="nav-title">';
            curItem += '<span class="kgcxicon' + (item.icon ? (' icon-' + item.icon) : '') + '"></span>';
            curItem += '<span class="text">' + item.name + '</span>';
            curItem += '<span class="angle fa fa-angle-left"></span>';
            curItem += '</div>';
            curItem += '<div class="nav-list"><ul>';
            $.each(item.children, function (x, submenu) {
              curItem += '<li class="nav-page' + (submenu.href === matched[1] ? ' on"' : '') + '">';
              curItem += '<span class="text" data-href="' + submenu.href + '.html">' + submenu.name + '</span>';
              curItem += '</li>';
            });
            curItem += '</ul>';
          } else {
            curItem += '<div class="nav-title">';
            curItem += '<span class="kgcxicon' + (item.icon ? (' icon-' + item.icon) : '') + '"></span>';
            curItem += '<span class="text" data-href="' + item.href + '.html">' + item.name + '</span>';
          }
          curItem += '</div>';
          curItem += '</div>';

          strMenu += curItem;
        });
      }

      $sideMenu.html(strMenu);
      $sideMenu.find('.nav-page.on').parents('.nav-item').find('.nav-title').click();

    }

  }

  // 主入口函数
  function main(callback) {
    // 获取登录信息
    $.Deferred(getLoginInfo).done(function () {
      // 获取菜单信息
      $.Deferred(getMenuInfo).done(function () {
        // 同步顶部的标题
        $('.content-title').html(function () {
          var ret = '未知页面';
          var $on = $sideMenu.find('.nav-item.on');
          if ($on.find('.nav-list').length > 0) {
            ret = $on.find('.nav-page.on').text();
          } else {
            ret = $on.find('[data-href]').text();
          }
          return ret;
        });
        if (isValidPage) {
          // 执行回调
          $(callback);
        } else {
          layer.confirm('没有该页面的操作权限！', {
            btn: ['返回首页', '重新登录'],
            cancel: function () {
              window.location.href = '/html/index/index.html';
            }
          }, function () {
            window.location.href = '/html/index/index.html';
          }, function () {
            // 清理所有缓存数据
            sessionStorage.clear();
            localStorage.clear();
            window.location.href = '/login.html';
          });
        }
      });
    }).done(function () {
      // 其他一些操作
    });
  }

  // 暴露 main 方法为全局变量
  window.main = main;

  // !!! layer 插件弹层闪动问题修复
  if (window.layer) {
    layer.config({shade: [1, 'rgba(0,0,0,.3)']});
  }

})(window, jQuery);
